package DBLayer;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import ModelLayer.*;

/**
 * 
 * @author DMAA0213 - Gruppe 2
 *
 */
public class DBMedlem implements IFDBMedlem {
	
	private Connection con;

	/**
	 * Constructor for DBMedlem objekt, uden parametre.
	 * Her startes DBConnection, hvis denne ikke i forevejen er aktiv. 
	 * @throws SQLException Kaster SQLException hvis der er fejl i connection.
	 */
	public DBMedlem() throws SQLException {
		try {
			con = DBConnection.getInstance().getDBcon();
		}
		catch (SQLException e) {
			throw e;
		}
		
	}

	
	@Override
	public Medlem login(String email, String password) throws SQLException {
		
		Medlem medlem = null;
		
		String query = "SELECT id, navn, adresselinje1, adresselinje2, medlem.postnummer, email, "
				+ "telefon, foedselsdato, passwordd, administrator, byy "
				+ "FROM Medlem, PostnummerBy WHERE medlem.postnummer=PostnummerBy.postnummer AND email=? AND passwordd=?";
		ResultSet result = null;
		try {
			PreparedStatement ps = con.prepareStatement(query);
			ps.setString(1, email);
			ps.setString(2, password);
			result = ps.executeQuery();
			if (result.next()) {
				medlem = buildMedlem(result);
			}
		} catch (SQLException e) {
			throw e;
		}
		
		return medlem;
	}
	
	
	@Override
	public ArrayList<Medlem> hentListe() throws SQLException {
		
		ArrayList<Medlem> arrayListMedlem = new ArrayList<Medlem>();
		
		Medlem medlem = null;
		String query = "SELECT id, navn, adresselinje1, adresselinje2, Medlem.postnummer, email, telefon, foedselsdato, passwordd, administrator, byy" 
		+ " FROM Medlem, PostnummerBy"
		+ " WHERE medlem.postnummer=PostnummerBy.postnummer";
		
		
		ResultSet result = null;
		try {
			PreparedStatement ps = con.prepareStatement(query);
			result = ps.executeQuery();
			while(result.next()) {
				medlem = buildMedlem(result);
				arrayListMedlem.add(medlem);
			}
		} catch (SQLException e) {
			throw e;
		}
		return arrayListMedlem;
	}
	
	
	private Medlem buildMedlem(ResultSet result) throws SQLException {
		
		Medlem medlem = new Medlem();
		try {
			
			medlem.setId(result.getInt("id"));
			medlem.setNavn(result.getNString("navn"));
			medlem.setAdresselinie1(result.getNString("adresselinje1"));
			medlem.setAdresselinie2(result.getNString("adresselinje2"));
			medlem.setPostNummer(result.getInt("postnummer"));
			medlem.setEmail(result.getNString("email"));
			medlem.setTelefon(result.getNString("telefon"));
			medlem.setFoedselsdato(result.getNString("foedselsdato"));
			medlem.setPassword(result.getNString("passwordd"));
			medlem.setAdministrator(result.getBoolean("administrator"));
			medlem.setBy(result.getNString("byy"));
									
		}
						
		 catch (SQLException e) {
			 System.out.println("fejl i forbindelse med oprettelse af medlem");
			
			throw e;
		}
		return medlem;
	}

	
	@Override
	public Medlem hent(int id) throws SQLException {
		
		Medlem medlem = null;
		
		String query = "SELECT id, navn, adresselinje1, adresselinje2, Medlem.postnummer, email, telefon, foedselsdato, passwordd, administrator, byy" 
				+ " FROM Medlem, PostnummerBy"
				+ " WHERE id=? AND medlem.postnummer=PostnummerBy.postnummer";
		
		ResultSet result = null;
		try {
			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1, id);
			result = ps.executeQuery();
			if (result.next()) {
				medlem = buildMedlem(result);
			}
		} catch (SQLException e) {
			throw e;
		}
		
		return medlem;
	}
	
	
	@Override
	public void ret(Medlem medlem) throws SQLException {
		
		try {
			
			DBConnection.startTransaction();
	
			String query="UPDATE Medlem SET navn=?, adresselinje1=?, adresselinje2=?, postnummer=?, email=?, telefon=?, foedselsdato=?, passwordd=?, administrator=?"+
			 	  
			          " WHERE id=?";
		
		          
			PreparedStatement ps = con.prepareStatement(query);
			ps.setNString(1, medlem.getNavn());
			ps.setNString(2, medlem.getAdresselinie1());
			ps.setNString(3, medlem.getAdresselinie2());
			ps.setInt(4, medlem.getPostnummer());
			ps.setNString(5, medlem.getEmail());
			ps.setNString(6, medlem.getTelefon());
			ps.setNString(7, medlem.getFoedselsdato());
			ps.setNString(8, medlem.getPassword());
			ps.setBoolean(9, medlem.getAdministrator().booleanValue());
			ps.setInt(10, medlem.getId());
			ps.executeUpdate();
		       
	
			DBConnection.commitTransaction();
		}
		catch (SQLException e) {
			System.out.println("SQL Error");
			System.out.println(e.getMessage());
			DBConnection.rollbackTransaction();
			throw e;
		
		}
		
	}	

	@Override
	public void slet(Medlem medlem) throws SQLException {
		
		try {
			
			String query="DELETE FROM Medlem WHERE id=?";
		
		          
			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1, medlem.getId());
			ps.executeUpdate();
		}
		catch(SQLException e){
			throw e;
			
		}

	}

	@Override
	public void indsaet(Medlem medlem) throws SQLException {
		
		try{				
			DBConnection.startTransaction();

			String query = "INSERT into Medlem(id, navn, adresselinje1, adresselinje2, postnummer, email, telefon, foedselsdato, passwordd, administrator) "
					+ "VALUES (?,?,?,?,?,?,?,?,?,?)";
			
			int nextId = GetMax.getMaxId("SELECT max(id)+1 FROM Medlem");
			medlem.setId(nextId);

			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1, nextId);
			ps.setString(2, medlem.getNavn());
			ps.setString(3, medlem.getAdresselinie1());
			ps.setString(4, medlem.getAdresselinie2());
			ps.setInt(5, medlem.getPostnummer());
			ps.setString(6, medlem.getEmail());
			ps.setString(7, medlem.getTelefon());
			ps.setString(8, medlem.getFoedselsdato());
			ps.setString(9, medlem.getPassword());
			
			if(medlem.getAdministrator()) {
				ps.setInt(10, 1);
			} 
			else {
				ps.setInt(10, 0);
			}
			
			ps.executeUpdate();
					
			

			DBConnection.commitTransaction();

		} catch (SQLException e) {
			DBConnection.rollbackTransaction();
			throw e;
		}
	
	}	

}
